package pruebasUnitarias;

import batalla.Pelea;
import unidades.Civil;
import unidades.Soldado;
import unidades.Unidad;
import mapas.Mapa;
import mapas.Region;
import civilizacion.Civilizacion;
import edificios.Casa;
import edificios.Edificio;
import excepcionesGenerales.ExcepImposibleEjecutar;
import excepcionesRegion.eRegionNoExistente;
import excepcionesUnidades.ExcepAtaqueInvalido;
import jugadores.Jugador;
import junit.framework.TestCase;

public class PruebaPeleaSoldadoCivil extends TestCase{
	
	//atributos de la prueba
	private Mapa miMapa;
	private Civilizacion cvl1;
	private Civilizacion cvl2;
	private Jugador j;
	private Region rg1;
	private Region rg2;
	private Unidad soldado;
	private Unidad civil;
	
	public PruebaPeleaSoldadoCivil(){
		//Asigno todas los atributos comunes a todas las pruebas
		miMapa = new Mapa();
		cvl1 = new Civilizacion("C1",miMapa);
		cvl2 = new Civilizacion("C2",miMapa);
		j = new Jugador("j",cvl1);
		rg1 = new Region("R1",2);
		rg2 = new Region("R2",2);
		miMapa.AgregarRegion(rg1);
		miMapa.AgregarRegion(rg2);
//		Conquisto las regiones
		Unidad c = new Civil(cvl1, rg1);
		Edificio e = new Casa(cvl1, rg1);
		rg1.agregar(c);
		rg1.agregar(e);
		
		Unidad c2 = new Civil(cvl2, rg2);
		Edificio e2 = new Casa(cvl2, rg2);
		rg2.agregar(c2);
		rg2.agregar(e2);
	}
	public void testPeleaDelMismoEquipo(){
		//creo unidades del mismo equipo
		soldado = new Soldado(cvl1,rg1);
		civil = new Civil(cvl1,rg2);
		try {
			miMapa.setLimitrofes(rg1,rg2);
		} catch (eRegionNoExistente e) {}
		try {
			Pelea p = j.Atacar(soldado, civil);
			p.ejecutar();
		} 
		catch (ExcepAtaqueInvalido e) {
			return; //el ataque es invalido ya que son del mismo equipo
		} catch (ExcepImposibleEjecutar e) {
			return; //la pelea no se tendria que ejecutar
		}
		//si llega aca es porque no funciono
		fail("Deberia haber tirado excepcion ya que son del mismo equipo");
		
	}
	public void testPeleaMismaRegion(){
		//creo unidades de la misma region 
		soldado = new Soldado(cvl2,rg1);
		civil = new Civil(cvl1,rg1);
		try {
			Pelea p= j.Atacar(soldado, civil);
			p.ejecutar();
		}
		catch (ExcepAtaqueInvalido e) {
			return; //el ataque es invalido ya que se estan atacando desde la misma region
		} catch (ExcepImposibleEjecutar e) {
			return; //la pelea no se tendria que ejecutar
		}
		//no deberia poder llegar aca, porque no se deben atacar
		fail("Deberia haber tirado excepcion ya que son de la misma region");
	}
	public void testPeleaSoldadoCivil(){
		//creo unidades de diferente equipo y region
		soldado = new Soldado(cvl1,rg1);
		civil = new Civil(cvl2,rg2);
		try {
			miMapa.setLimitrofes(rg1,rg2);
		} catch (eRegionNoExistente e) {}
		try {
			Pelea p =j.Atacar(soldado, civil);
			p.ejecutar();
		} 	
		//si entra aca es porque no se atacaron y deberian haberlo hecho
		catch (ExcepAtaqueInvalido e) {
			fail("Deberia haber atacado bien");
		} catch (ExcepImposibleEjecutar e) {
			fail("Se deberia haber ejecutado la pelea");
		}
		//el civil debe estar muerto y el soldado no
		assertFalse(civil.estaVivo());
		assertTrue(soldado.estaVivo());
		//El soldado mato al civil, entonces se tendria que haber promovido
		//El ataque nuevo seria 2, y la defensa nueva seria 2
		assertTrue(soldado.getAtaque() == 2);
		assertTrue(soldado.getDefensa() == 2);
	}
	public void testPeleaCivilSoldado(){
		
		//creo dos unidades de diferente equipo y region
		 soldado = new Soldado(cvl1,rg1);
		 civil = new Civil(cvl2,rg2);
		 try {
				miMapa.setLimitrofes(rg1,rg2);
		 } catch (eRegionNoExistente e) {}
		try {
			Pelea p =j.Atacar(civil,soldado);
			p.ejecutar();
		}
		catch (ExcepAtaqueInvalido e) {
			return; //el ataque es invalido ya que los civiles no pueden atacar
		} catch (ExcepImposibleEjecutar e) {
			return; //la pelea no se tendria que ejecutar
		}
		//el soldado debe estar vivo y el civil tambien, ya que no tiene poder de ataque
		fail("No deberia haber atacado");
		
	}
	public void testPeleaRegionesNoLimitrofes(){
		//creo dos unidades de diferente equipo y region
		 soldado = new Soldado(cvl1,rg1);
		 civil = new Civil(cvl2,rg2);
		try{
			Pelea p = j.Atacar(soldado, civil);
			p.ejecutar();
		}
		catch (ExcepAtaqueInvalido e) {
			return; //el ataque es invalido ya que las regiones no son limitrofes
		} catch (ExcepImposibleEjecutar e) {
			return; //la pelea no se tendria que ejecutar
		}
		fail("No se deberian haber atacado por estar en regiones no limitrofes");
	}
}
